package cn.com.liu.b_processDefinition;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipInputStream;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.apache.commons.io.FileUtils;
import org.junit.Test;

public class ProcessDefinitionTest {
 
	ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
	/**部署流程定义*/
	@Test
	public void deploymentProcessDefinition(){
		Deployment deployment=processEngine.getRepositoryService()//与流程定义和部署相关的service
		.createDeployment()//创建一个部署对象
		.name("流程定义")//添加部署的名称
		.addClasspathResource("diagrams/helloworld.bpmn")//从classpath的资源中加载，一次只能加载一个文件
		.addClasspathResource("diagrams/helloworld.png")//从classpath的资源中加载，一次只能加载一个文件
		.deploy();//完成部署
		
		System.out.println("部署ID："+deployment.getId());
		System.out.println("部署名称："+deployment.getName());
	}
	
	/**部署流程定义（从zip）*/
	@Test
	public void deploymentProcessDefinitionFromZIP(){
		InputStream in=this.getClass().getClassLoader().getResourceAsStream("diagrams/helloworld.zip");
		ZipInputStream zipInputStream=new ZipInputStream(in);
		Deployment deployment=processEngine.getRepositoryService()//与流程定义和部署相关的service
		.createDeployment()//创建一个部署对象
		.name("流程定义")//添加部署的名称
		.addZipInputStream(zipInputStream)//指定zip格式的文件完成部署
		.deploy();//完成部署
		
		System.out.println("部署ID："+deployment.getId());
		System.out.println("部署名称："+deployment.getName());
	}
	
	/**查询流程定义*/
	@Test
	public void findProcessDefinition(){
	List<ProcessDefinition>	list=processEngine.getRepositoryService()//流程定义与部署对象相关的service
		.createProcessDefinitionQuery()//创建一个流程定义的查询
		/**指定查询条件，where条件*/
//		.deploymentId(deploymentId)//使用部署对象id查询
//		.processDefinitionId(processDefinitionId)//使用流程定义id查询
//		.processDefinitionKey(processDefinitionKey)//使用流程定义key查询
//		.processDefinitionNameLike(processDefinitionNameLike)//使用流程定义名称模糊查询
		
		/**排序*/
		.orderByProcessDefinitionVersion().asc()//按照版本号的升序排序
//		.orderByDeploymentId().desc()//按照部署id降序排序
		
		/**返回的结果集*/
		.list();//返回一个集合列表
//		.singleResult()//返回唯一结果集
//		.count()//返回结果集数量
//		.listPage(firstResult, maxResults)//分页查询
	if(list!=null && list.size()>0){
		for (ProcessDefinition pd : list) {
			System.out.println("流程定义id："+pd.getId());//流程定义的key：+版本：+随机生成数
			System.out.println("流程定义名称："+pd.getName());//对应的是helloworld.bpmn文件中的name属性值
			System.out.println("流程定义key："+pd.getKey());//对应的是helloworld.bpmn文件中的id属性值
			System.out.println("流程定义版本："+pd.getVersion());//流程定义key值相同的情况下，版本升级，默认是1
			System.out.println("png文件名称："+pd.getDiagramResourceName());
			System.out.println("bpmn文件名称："+pd.getResourceName());
			System.out.println("部署对象id："+pd.getDeploymentId());
			System.out.println("*********************************************");
		}
	}
	}
	
	/**删除流程定义*/
	@Test
	public void deleteProcessDefinition(){
		String deploymentId="1201";
		/**
		 * 不带级联的删除
		 * 只能删除没有启动的流程，如果流程启动就会抛出异常
		 */
//		processEngine.getRepositoryService()
//		.deleteDeployment(deploymentId);
//		System.out.println("删除成功");
		
		/**
		 * 级联删除
		 * 不管流程是否启动，都能删除
		 */
		processEngine.getRepositoryService()
		.deleteDeployment(deploymentId,true);
		System.out.println("删除成功");
	}
	
	/**
	 * 查看流程图片
	 * @throws IOException 
	 */
	@Test
	public void viewProcessDiagrams() throws IOException{
		String deploymentId="401";
		//获取图片资源名称
		List<String> list=processEngine.getRepositoryService().getDeploymentResourceNames(deploymentId);
		String resourceName="";//图片资源的名称
		if(list!=null&&list.size()>0){
		for (String name : list) {
			if(name.indexOf(".png")>0){
				resourceName=name;
			}
		}
	}
		//获取图片输入流
		InputStream in = processEngine.getRepositoryService().getResourceAsStream(deploymentId, resourceName);
		//将图片生成到d盘的目录下
		File file=new File("D:/dd"+resourceName);
		//将输入流的图片写到d盘下
		FileUtils.copyInputStreamToFile(in, file);
		
}
	
	/**
	 * 查询最新版本的流程定义
	 */
	@Test
	public void findAllLatestVersion(){
		//查询，把最大的版本都排到最后
	List<ProcessDefinition> list=processEngine.getRepositoryService().createProcessDefinitionQuery()
		.orderByProcessDefinitionVersion().asc().list();
	//过滤出最新的版本
	Map<String, ProcessDefinition> map=new LinkedHashMap<String, ProcessDefinition>();
	if(list!=null&&list.size()>0){
		for (ProcessDefinition pd : list) {
			map.put(pd.getKey(), pd);
		}
	}
	List<ProcessDefinition> pdList=new ArrayList<ProcessDefinition>(map.values());
	for (ProcessDefinition pd : pdList) {
		System.out.println("流程id："+pd.getId()+",流程名称："+pd.getName()+",流程key:"+pd.getKey()
				+",流程版本："+pd.getVersion()+",部署id："+pd.getDeploymentId());
	}
	}
	
	/**
	 * 删除流程定义（删除key相同的所有不同版本的流程定义）
	 */
	@Test
	public void deleteProcessDefinitionByKey(){
		String processDefinitionKey="helloworld";
		List<ProcessDefinition> list=processEngine.getRepositoryService().createProcessDefinitionQuery()
		.processDefinitionKey(processDefinitionKey).list();
		
		for (ProcessDefinition pd : list) {
			String deploymentId=pd.getDeploymentId();
			processEngine.getRepositoryService().deleteDeployment(deploymentId, true);
			
		}
	}
	
}